package com.sloan.community.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.CustomConversions;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.r2dbc.convert.R2dbcCustomConversions;
import org.springframework.data.r2dbc.dialect.DialectResolver;
import org.springframework.data.r2dbc.dialect.R2dbcDialect;
import org.springframework.r2dbc.core.DatabaseClient;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Configuration
public class R2dbcConfig {


    @Bean
    public R2dbcCustomConversions r2dbcCustomConversions(DatabaseClient databaseClient) {
        R2dbcDialect dialect = DialectResolver.getDialect(databaseClient.getConnectionFactory());
        List<Object> converters = new ArrayList<>(dialect.getConverters());
        converters.addAll(R2dbcCustomConversions.STORE_CONVERTERS);
        return new R2dbcCustomConversions(
                CustomConversions.StoreConversions.of(dialect.getSimpleTypeHolder(), converters),
                Collections.singleton(NumberToBooleanConverter.INSTANCE));
    }

    /**
     * TODO: 这里是为了解决R2DBC无法将 mysql的bit类型转换为 boolean类型做的转换器
     *  问题原因：上面的dialect其实已经自动绑定了两个转换器  ByteToBooleanConverter，BooleanToByteConverter
     *   在插入数据库的时候使用 BooleanToByteConverter 将实体类中的 Boolean转换成 bit插入mysql,
     *   但是在读取数据的时候从mysql中bit转换为实体类的boolean时候，并没有用到ByteToBooleanConverter，而是从mysql中的bit类型给变为了HeapByteBuffer类型，并不是Byte类型，很奇怪
     *   所以这里定义一个转换器解决这个问题，应该是R2DBC的版本问题
     */
    @ReadingConverter
    enum NumberToBooleanConverter implements Converter<ByteBuffer, Boolean> {
        INSTANCE;

        @Override
        public Boolean convert(ByteBuffer byteBuffer) {
            return byteBuffer.get(0)!=0;
        }
    }
}
